User blog:Swaxhog/Simple Map Drawing Exercise
Working my way through the various features of Petit Computer, I tried doing a little old school rpg mapping. You know the type, with the tiny visible window and areas for character stats and text information? I combined this with practicing 2 dimensional arrays, reading data, using a background image, and using custom sprites I drew horribly. The tricky part for me was to tackle was how the map is drawn and the 'man' travels. Normally you are in the center of the map until the map reaches it's boundries. Then the map stays in place and the man continues to move until it reaches the edge of the map. This allows the map to show its maximum visible range at all times. I might have made this more complicated than I needed but it works. That's always step 1. My sample map is 32x32 read from a string of DATA statements. The visible window is 13x11 and your 'home' coordinate is at offset (7,6) of this window. The next step would be to have a rountine that checks whether your next move is a valid one (can't walk on water for example) or perhaps a special like a door or a chest. This would be done by checking the map(x,y) value and knowing your data (ex. 1=water, 2=grass, 3=door, 4=rock, 5=brick, etc). I may or may not continue this way. I think I'd rather try using a background and using offsets, clip plane and bgread. This will be my next exercise! Anyway, here is my code. I didn't post my custom sprites, they are pretty bad but the default set will show how things move around. The program consists of 2 parts: The code and a background image both called SXDR1. Here are the QR Codes: and the code: REM MAP DRAWING DEMO PNLTYPE "OFF": ACLS : GCLS : CLEAR: SYSBEEP=FALSE VISIBLE 1,1,1,1,1,1 BGPAGE 0 : REM 1 = LOWER REM LOAD "BGU0:UL1",FALSE LOAD "SCU0:SXDR1",FALSE SPCLR DIM MAP(32,32) FOR I=0 TO 31: FOR J=0 TO 31 READ MAP(J,I): NEXT: NEXT X=0: Y=0: GX=7 : GY=6: UMAP=FALSE 'DRAW GAME WINDOW AREA FOR DY=Y TO 10: FOR DX=X TO 12 BGPUT 0,DX+1,DY+1,MAP(DX+X,DY+Y),8,0,0: NEXT: NEXT BGPUT 0,GX,GY,32,8,0,0 @MAIN B=BUTTON() IF B 1 THEN GOSUB @UP IF B 2 THEN GOSUB @DOWN IF B 4 THEN GOSUB @LEFT IF B 8 THEN GOSUB @RIGHT IF B AND 64 THEN @ENDME IF B AND 16 THEN GOSUB @ENTER IF UMAP THEN GOSUB @DRAWMAP VSYNC 8 GOTO @MAIN @ENTER GOTO @ENTERDONE @DOOR LOCATE 22,2: PRINT "DOOR!" GOTO @ENTERDONE @ENTERDONE RETURN @DRAWMAP FOR DY=Y TO Y+10: FOR DX=X TO X+12 BGPUT 0,DX-X+1,DY-Y+1,MAP(DX,DY),8,0,0: NEXT: NEXT BGPUT 0,GX,GY,32,8,0,0 UMAP=FLASE ' DEBUG LOCATE 1,19: PRINT "X=";X;" ";"GX=";GX;" " LOCATE 1,20: PRINT "Y=";Y;" ";"GY=";GY;" " RETURN @UP IF (Y 0 AND GY<=6) THEN @UPSHIFT1 IF (Y 21 AND GY>6) THEN @UPSHIFT2 Y=Y-1 GOTO @UPDONE @UPSHIFT1 GY=GY-1: IF GY<1 THEN GY=1 GOTO @UPDONE @UPSHIFT2 GY=GY-1: IF GY<6 THEN GY=6 @UPDONE B=0: UMAP=TRUE RETURN @DOWN IF (Y 0 AND GY<6) THEN @DNSHIFT1 IF (Y 21 AND GY>=6) THEN @DNSHIFT2 Y=Y+1 GOTO @DNDONE @DNSHIFT1 GY=GY+1: IF GY>6 THEN GY=6 GOTO @DNDONE @DNSHIFT2 GY=GY+1: IF GY>11 THEN GY=11 @DNDONE B=0: UMAP=TRUE RETURN @LEFT IF (X 0 AND GX<=7) THEN @LFSHIFT1 IF (X 19 AND GX>7) THEN @LFSHIFT2 X=X-1 GOTO @LFDONE @LFSHIFT1 GX=GX-1: IF GX<1 THEN GX=1 GOTO @LFDONE @LFSHIFT2 GX=GX-1: IF GX<7 THEN GX=7 @LFDONE B=0: UMAP=TRUE RETURN @RIGHT IF (X 0 AND GX<7) THEN @RTSHIFT1 IF (X 19 AND GX>=7) THEN @RTSHIFT2 X=X+1 GOTO @RTDONE @RTSHIFT1 GX=GX+1: IF GX>7 THEN GX=7 GOTO @LFDONE @RTSHIFT2 GX=GX+1: IF GX>13 THEN GX=13 @RTDONE B=0: UMAP=TRUE RETURN @ENDME ACLS:GCLS:BGMSTOP:SYSBEEP=TRUE END DATA 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1 DATA 1,2,2,2,2,2,2,2,4,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,1 DATA 1,2,2,2,2,2,2,4,4,4,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,1 DATA 1,2,2,2,2,2,2,2,4,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,1 DATA 1,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,1 DATA 1,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,1 DATA 1,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,1 DATA 1,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,1 DATA 1,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,1 DATA 1,2,2,2,2,2,5,5,5,5,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,1 DATA 1,2,2,2,2,2,5,5,3,5,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,1 DATA 1,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,1 DATA 1,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,1 DATA 1,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,5,5,5,2,2,2,2,2,2,2,2,1 DATA 1,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,5,3,5,2,2,2,2,2,2,2,2,1 DATA 1,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,1 DATA 1,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,1 DATA 1,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,1 DATA 1,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,1 DATA 1,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,1 DATA 1,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,1 DATA 1,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,1 DATA 1,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,1 DATA 1,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,1 DATA 4,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,1 DATA 4,4,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,1 DATA 4,4,4,2,2,2,2,2,2,2,2,2,2,2,2,2,2,7,7,7,2,2,2,2,2,2,2,2,2,2,2,1 DATA 4,4,4,4,2,2,2,2,2,2,2,2,2,2,2,2,2,7,8,7,2,2,2,2,2,2,2,2,2,2,2,1 DATA 4,4,4,4,4,2,2,2,2,2,2,2,2,2,2,2,2,7,2,7,2,2,2,2,2,2,2,2,2,2,2,1 DATA 4,4,4,4,4,4,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,1 DATA 4,4,4,4,4,4,4,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,1 DATA 4,4,4,4,4,4,4,4,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1 Category:Blog posts